import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:photo_manager/photo_manager.dart';

import '/app/constant/file_type_enum.dart';
import '/app/utils/file_size_converter.dart';
import '/app/utils/json_helper.dart';
import '/app/utils/time_utils.dart';

class VideoModel extends JsonSerializable {
  late FileTypeEnum type;

  // AssetEntity 的文件id
  late String assetId;

  // 缩略图Base64
  late String thumbnailImage;

  // 是否已失效
  late bool isInvalid = false;

  // 文件名称
  late String title;

  // 文件路径
  late String path;

  // 文件大小 字节
  late int size;

  // 视频时长 (ms)
  late int duration;

  // 当前播放时间  -1 表示没有播放过 （ms）
  late int currentTime = -1;

  VideoModel(this.type, this.assetId, this.title, this.path, this.size, this.duration, this.currentTime);

  // 获取当前播放时间
  String getCurrentTimeStr() {
    // 如果当前播放时间小于0，则表示没有播放过，则返回视频时长
    if (currentTime < 0) {
      return "";
    }
    return TimeUtils.millisecondsToFormattedTime(currentTime);
  }

  String getDurationStr() {
    // 如果当前播放时间小于0，则表示没有播放过，则返回视频时长
    if (duration < 0) {
      return "";
    }
    return TimeUtils.millisecondsToFormattedTime(duration);
  }

// 获取当前文件大小  通过 FileSizeConverter.convertToReadableSize 进行转换
  String getSizeStr() {
    return FileSizeConverter.convertToReadableSize(size);
  }

  saveThumbnailImage(Uint8List data) {
    this.thumbnailImage = base64Encode(data);
  }

  // 将 thumbnailImage 转换为 Uint8List ， thumbnailImage 是当前图片的base64 的字符串结果，转换为 Uint8List
  Uint8List getThumbnailImageUint8List() {
    try {
      return base64Decode(this.thumbnailImage);
    } catch (e) {
      return _getDefaultThumbnail();
    }
  }

// 返回一个默认的 Uint8List（例如：生成一个空图片或者自定义的默认图片）
  Uint8List _getDefaultThumbnail() {
    // 示例：返回一个空的 Uint8List，你可以根据需要生成实际的默认图片
    return Uint8List.fromList([0, 0, 0, 0]); // 可以根据需要定义内容
  }

  static convert(FileTypeEnum type, AssetEntity assetEntity, int? currentTime) async {
    print('VideoModel#convert 数据转换: $type ');
    // 默认类型为 AssetEntity
    if (type == FileTypeEnum.AssetEntity) {
      print('VideoModel#convert 数据转换 AssetEntity: $type ');
      File? file = await assetEntity.originFile;
      int size = 0;
      // 检查文件是否存在
      if (file != null) {
        print('VideoModel#convert 文件大小 ');
        // 获取文件大小（单位：字节）
        size = await file.length();
        print('VideoModel#convert 文件大小: $size ');
      }
      // 设置默认值
      currentTime ??= 0;
      print('VideoModel#convert 播放时间: $currentTime ');
      int duration = assetEntity.duration ?? 0;
      String path = assetEntity.relativePath ?? "";
      String assetId = assetEntity.id;
      String title = assetEntity.title ?? "";
      Uint8List? thumbnailImage = await assetEntity.thumbnailData;
      print('VideoModel#convert 属性值转换完成');
      VideoModel model = VideoModel(type, assetId, title, path, size, duration, currentTime);
      model.saveThumbnailImage(thumbnailImage!);
      print('VideoModel#convert 数据对象转换完成');
      return model;
    }
    print('VideoModel#convert 暂不支持该类型');
    // 其他类型 待定，暂时先抛异常
    throw Exception("暂不支持该类型");
  }

  // 事项   // 实现 fromJson
  factory VideoModel.fromJson(Map<String, dynamic> json) {
    return VideoModel(
      FileTypeEnum.values.firstWhere((element) => element.toString() == json['type']),
      json['assetId'],
      json['title'],
      json['path'],
      json['size'],
      json['duration'],
      json['currentTime'],
    );
  }

// 实现 toJson
  @override
  Map<String, dynamic> toJson() {
    return {
      'type': type.toString(),
      'assetId': assetId,
      'title': title,
      'path': path,
      'size': size,
      'duration': duration,
      'currentTime': currentTime,
    };
  }

// 静态块注册类
  static final _ = JsonSerializable.register<VideoModel>('VideoModel', (json) => VideoModel.fromJson(json));
}
